# -*- coding: utf-8 -*-
"""
Created on Sun Aug 27 20:09:03 2023

@author: skunk69
"""

import json

chinese_name = u'人格障碍诊断问卷'
english_name = 'Personality Diagnostic Questionnaire'
abbreviation = 'PDQ-4+'
category = u'精神病学临床量表'

outline = u"""人格诊断问卷(Personality Diagnostic Questionnaire, PDQ)是美国Hyler博士(1983)根据DSM-III中人格障碍的诊断标准编制的自陈式问卷。PDQ-4+则是依据DSM-IV对PDQ所作的进一步修订，包括107个项目，归为12个因子，分别用于评估DSM-IV中的12种类型的人格障碍。该量表为临床筛查量表，而不是诊断量表。1996年湖南医科大学杨坚博士将其翻译成中文，并就中国文化背景对其中的7个条目做了修改，又增加了8个新的条目，形成了PDQ-4+的中文版本。"""

instruction = u"""此问卷的目的是让你自己来描述你是哪种类型的人，在回答问题时，想想你在过去几年内所常有的感受，思考和活动方式。回答“是”指该句子一般符合你的情况，“否”是指该句子一般不符合您的情况，即使你不能完全确定怎样回答，请仍对每个问题都标明“是”或“否”，答案无所谓正确与否，你可任意花多长时间来回答这些问题。"""

with open('PDQ-4+.txt','r',encoding='utf-8') as f:
    lines = f.readlines()
    f.close()

lines_items = [l.strip() for l in lines[0:128]]
lines_scales = [l.strip() for l in lines[128:140]] 
lines_scales_definition = [l.strip() for l in lines[140::]] 

items = {}
for line in lines_items[0:105]:
    key,value = line.split('.')
    items[key] = value.strip()
   
lines_106 = lines[105:112]
item = {}
for num,line in enumerate(lines_106[1::]):
    k,v = line.split(')')
    item[num+1] = v.strip()
items[106] = [lines_106[0].split('.')[-1].strip(),item]   

lines_107 = lines[112:128]
item = {}
for num,line in enumerate(lines_107[1::]):
    k,v = line.split(')')
    item[num+1] = v.strip()
items[107] = [lines_107[0].split('.')[-1].strip(),item]   

reverse_items = []
scales = []
for line in lines_scales:
    _,value = line.strip().split('）')
    scales.append(value.strip())
scales_items = [
    [11,24,37,50,62,85,96],# 偏执型
    [9,22,34,47,60,71,95],# 分离型
    [10,23,36,48,60,61,72,74,86],# 分裂型
    [4,17,30,43,55,102,67,80,90],# 表演型
    [5,18,31,44,57,68,73,79,92,103],# 自恋型
    [8,20,33,46,59,75,94,107],# 反社会型
    [100,6,101,19,32,45,58,69,78,93,106],# 边缘型
    [98,1,13,26,39,52,83,87],# 回避型
    [2,15,27,40,53,65,82,88],# 依赖型
    [99,3,16,29,41,54,66,81,105,89,104],# 强迫型
    [7,21,35,49,63,77,91],# 被动攻击型
    [14,28,42,56,70,84,97],# 抑郁型
    ]
cover_up_items = [12,25,38,51]
doubt_items = [64,76]
contradictory_items = [[6,100],[19,101],[67,102],[92,103],[98,1],[99,3],[89,105]]

# check scales_items
print(f'scale length={[len(l) for l in scales_items]}')

check = []
for l in scales_items:
    check = check+l
check = check+cover_up_items+doubt_items

print(f'len(check)={len(check)}')

# complementary set
check_set = {i for i in sorted(check)}^{i for i in range(1,108)}
print(f'complementary set= {check_set}')

scale = {}
for num,line in enumerate(lines_scales_definition[::2]):
    k,v = line.split('）',maxsplit=1)
    scale[num+1] = v.strip()
    
definition = {}
for num,line in enumerate(lines_scales_definition[1::2]):
    definition[num+1] = line.strip()

scales_definition = {}
for key in range(1,len(definition)+1):
    scales_definition[key] = [scale[key],definition[key]]

factors = []
factors_scales = [] 
rating = [u'是',u'否']
score_rules = [1,0]

contents = {
    'instruction':instruction,
    'items':items,
    'reverse_items':reverse_items,
    'scales':scales,
    'scales_definition':scales_definition,
    'scales_items':scales_items,
    'cover_up_items':cover_up_items,
    'doubt_items':doubt_items,
    'contradictory_items':contradictory_items,    
    'factors':factors,
    'factors_scales':factors_scales,
    'rating':rating,
    'score_rules':score_rules       
    }

implementation = u"""《人格障碍诊断问卷》是一个自评量表。适用于18岁以上成年人；应具有中等以上的文化程度，一般要求为初中以上。"""

reliability = u"""PDQ-4+的各分量表和总分的重测相关为0.5~0.8，说明该量表重复使用的稳定性好，各分量表分半信度系数经Spearman-Brown公式矫正所得结果为0.55~0.77，总分为0.93；量表内项目间相关分析的Cronbach α系数为0.56~0.78，都达到了中度程度以上的相关，说明PDQ-4+在中国人群中应用有较好的稳定性。"""
validity = u"""以PDQ-4+的总分做筛查人格障碍的灵敏度和特异度分析，发现总分在19~28时，灵敏度在89~93%，特异度可达到47%~65%，当总分在28~30时，正确指数为54.31%。"""
measurements = {'reliability':reliability,'validity':validity}

interpretation = u"""PDQ-4+测量结果的主要处理步骤如下：
1、掩饰和装好倾向，通过掩饰分、怀疑分及矛盾题数判断受试者在回答问卷时是否存在掩饰和装好倾向。
掩饰分=（1-条目12得分）+（1-条目25得分）+（1-条目38得分）+条目51得分
怀疑分=条目64得分+条目76得分
矛盾题：[6,100]，[19,101]，[67,102]，[92,103]，[98,1]，[99,3]，[89,105]。
一般来说，掩饰分≥2分，怀疑分≥1分，矛盾题≥4对，代表测验无效。
2、总分，能反映受试者具有人格障碍特点的可能性，即总分越高，越可能具有某种或几种类型的人格障碍的特点。根据原始分的划界原理为：依据原始分对应的人群百分位，分为三个区间：极高、偏高、正常，极高表示高于95%的人，偏高表示高于90%的人，正常表示不处于最高的10%人群内。
3、分量表分，该量表包含12个分量表，对应12种类型的人格障碍。分量表分反映受试者具有某一类型人格障碍的可能性。
分量表具体计分方法如下：
（1）偏执型
包括条目[11,24,37,50,62,85,96]，这些条目得分之和得到维度分。临界值≥4。
（2）分离型
包括条目[9,22,34,47,60,71,95]，这些条目得分之和得到维度分。临界值≥4。
（3）分裂型
包括条目[10,23,36,48,60,61,72,74,86]，这些条目得分之和得到维度分。临界值≥5。
（4）表演型
包括条目[4,17,30,43,55,102,67,80,90]，计分键4+17+30+43+55+102(67)+80+90，其中102(67)表示只计括号外条目的得分。临界值≥5。
（5）自恋型
包括条目[5,18,31,44,57,68,73,79,92,103]，计分键5+18+31+44+57+68+73+79+92(103)。临界值≥5。
（6）反社会型
包括条目[8,20,33,46,59,75,94,107]，这些条目得分之和得到维度分。临界值≥3。注意，条目107包括15个子题目，3个以上子题目回答为“是”时，该条目计1分，否则计0分。
（7）边缘型
包括条目[100,6,101,19,32,45,58,69,78,93,106]，注意，条目106包括5个子题目，2个以上子题目回答为“是”时，该条目计1分，否则计0分。
计分键100(6)+101(19)+32+45+58+69+78+93+106。临界值≥5。
（8）回避型
包括条目[98,1,13,26,39,52,83,87]，计分键98(1)+13+26+39+52+83+87。临界值≥4。
（9）依赖型
包括条目[2,15,27,40,53,65,82,88]，这些条目得分之和得到维度分。临界值≥5。
（10）强迫型
包括条目[99,3,16,29,41,54,66,81,105,89,104]，计分键99(3)+16+29+41+54+66+81+105(89)+104。临界值≥4。
（11）被动攻击型
包括条目[7,21,35,49,63,77,91]，这些条目得分之和得到维度分。临界值≥4。
（12）抑郁型
包括条目[14,28,42,56,70,84,97]，这些条目得分之和得到维度分。临界值≥5。"""

applications = u"""PDQ-4+具有较高的灵敏度和中等水平的特异度，因此更适宜于人格障碍筛查。在临床上对筛查出的可疑患者若能配合半定式或定式的人格障碍访谈工具，则诊断的准确率更高。"""

this_scale = {
    'chinese_name':chinese_name,
    'english_name':english_name,
    'abbreviation':abbreviation,
    'category':category,
    'outline':outline,
    'contents':contents,
    'implementation':implementation,
    'measurements':measurements,
    'interpretation':interpretation,
    'applications':applications    
    }

with open(abbreviation+'.json','w+',encoding='utf-8') as f:
    json.dump(this_scale,f,indent=2,ensure_ascii=False)